home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / asm / alib11b.zip / CODE1.ZIP / CMOS / CMOSCRC.ASM next >
Assembly Source File  |  1994-10-03  |  2KB  |  108 lines

  1. ;----------------------------------------------------------------------------
  2. ; checksum cmos
  3. ;  inputs: dl = ps2 flag  0=not ps2  1=this is a ps2
  4. ;  outputs: al = 0 checksum ok
  5. ;                1 checksum bad
  6. ;           bx = computed checksum
  7. ;
  8. checksum_cmos:
  9.     sub    bx,bx
  10.     sub    cx,cx
  11.     mov    cl,cm10            ;diskette byte offset
  12.     mov    ch,cm2e            ;checksum high byte
  13.     cmp    dl,1            ;check if ps2
  14.     jne    cmos2
  15.     mov    bx,-1            ;init crc to -1
  16.     mov    ch,cm34            ;ps2 end point
  17.  
  18. cmos2:    mov    al,cl
  19.  
  20.     push    ax
  21.     call    read_cmos
  22.     add    sp,2        ;fix stack
  23.     
  24.     sub    ah,ah
  25.     cmp    dl,1        ;check if ps2
  26.     jne    norm_cksm
  27. ;
  28. ; ps2 crc calc     al=raw data  bx=crc so far
  29. ;
  30.     call    crc_sum1
  31.     jmp    norm_ck_cont
  32. norm_cksm:
  33.     add    bx,ax
  34. norm_ck_cont:
  35.     inc    cl
  36.     cmp    ch,cl
  37.     jnz    cmos2
  38.     cmp    dl,1        ;check if ps/2
  39.     jne    normal_checksum
  40.     or    bx,bx
  41.     jnz    bad_checksum
  42. ;
  43. ; check  ps/2 checksum
  44. ;
  45.     mov    al,cm32        ;address checksum high
  46.     
  47.     push    ax
  48.     call    read_cmos
  49.     add    sp,2        ;fix stack
  50.     
  51.     mov    ah,al
  52.     mov    al,cm33        ;address checksum low
  53.     
  54.     push    ax
  55.     call    read_cmos
  56.     add    sp,2        ;fix stack
  57.     mov    bx,ax
  58.     sub    ax,ax
  59.     
  60.     jmp    cmos_ck_exit
  61.  
  62. normal_checksum:
  63.     or    bx,bx
  64.     jz    bad_checksum
  65.     mov    al,cm2e        ;address checksum high
  66.     
  67.     push    ax
  68.     call    read_cmos
  69.     add    sp,2        ;fix stack
  70.     
  71.     mov    ah,al
  72.     mov    al,cm2f        ;address checksum low
  73.     
  74.     push    ax
  75.     call    read_cmos
  76.     add    sp,2        ;fix stack
  77.     
  78.     cmp    ax,bx
  79.     jne    bad_checksum
  80.     sub    ax,ax
  81.     jmp    cmos_ck_exit
  82. bad_checksum:
  83.     mov    al,1
  84. cmos_ck_exit:
  85.     ret
  86. ;
  87. ; crc calculation
  88. ;
  89. crc_sum1:
  90.     push    ax
  91.     push    cx
  92.     mov    cl,4
  93.     xor    bh,al
  94.     mov    al,bh
  95.     rol    ax,cl
  96.     xor    bx,ax
  97.     rol    ax,1
  98.     xchg    bh,bl
  99.     xor    bx,ax
  100.     ror    ax,cl
  101.     and    al,0e0h
  102.     xor    bx,ax
  103.     ror    ax,1
  104.     xor    bh,al
  105.     pop    cx
  106.     pop    ax
  107.     ret
  108.